/**
 *  @file .
 *  @author wangxiaowei <wangxiaowei0303@163.com>
 *  @date 2015-02-11-10.10
 */

#ifndef org_wxw_stl_study_include_bits_move_h_
#define org_wxw_stl_study_include_bits_move_h_


namespace mystd{


/**
 *  获取 r 引用的对象的地址.
 *  为什么我们被直接使用取址运算符"&"来获取 r 的地址呢,这是因为 r 对象的类型
 *  T 可能重载了 operator&,从而导致 & 可能不能用作取址运算符.
 */
template<typename T>
inline T* __addressof(T &r){
	char const volatile &t = reinterpret_cast<char const volatile&>(r);
	// 注意 reinterpret_cast 不会去除 const,volatile 限定符,所以为了防止 r
	// 可能具有 volatile,const 属性而导致此处编译出错,所以使用了限定符

	char &t1 = const_cast<char&>(t);
	// 利用 const_cast 转换去除 const,volatile 属性

	return reinterpret_cast<T*>(&t1);
	// 此时由于基本内置类型 char 不可能重载其 operator&,所以 &t1 是获取 t1 的地址.
}


};


#endif // org_wxw_stl_study_include_bits_move_h_
